In dieser Einheit geht es um einfache Datenbankabfragen mit SQL, in Bezug auf unsere Aufgabenstellung. Wir schauen uns die sogenannte Data-Retrieval-Language an, also kurz D-R-L, und lernen, wie man mit einfachen Befehlen wie "Select" und "From" Daten aus einer Tabelle lesen kann. Außerdem betrachten wir sogenannte Aggregatfunktionen wie Max oder Count. Hier sehen wir die Ausgangslage. Wir arbeiten mit mehreren Tabellen, die untereinander verbunden sind. Jede Tabelle hat bestimmte Spalten mit klar definierten Datentypen. Diese Struktur bildet die Grundlage für alle folgenden Abfragen. Der erste und einfachste SQL-Befehl lautet: "Select Stern From produkt". Der Stern bedeutet, dass alle Spalten ausgewählt werden. Die Abfrage gibt also alle Informationen aus der Tabelle produkt zurück. Man sollte sich also merken, dass der Stern in SQL immer für alle Spalten einer Tabelle steht. Das ist besonders nützlich, wenn Sie sich erst einmal einen schnellen Überblick verschaffen wollen, bevor Sie gezielter suchen. Hier sehen wir jetzt alle verfügbaren Produkte. Mit "Select Stern From rechnung" können wir alle Einträge aus der Tabelle rechnung anzeigen lassen. Auch hier bedeutet der Stern wieder: Alle Spalten sollen angezeigt werden. Die Ausgabe enthält alle Rechnungen in der Datenbank. Man sieht hierbei zum Beispiel die Rechnungsnummer, mit dem passenden Datum und so weiter. Das ist eine einfache Möglichkeit, die Datenbasis zu überblicken. Jetzt wird es etwas spezifischer. Mit "Select vorname, nachname From privatkunde" erhalten wir nur die Vornamen und Nachnamen der Kunden. Somit kann man so gezielt einzelne Spalten auswählen. So sieht man alle Kundennamen in einer einfachen Liste, ohne zusätzliche Informationen. Die Kundennummer wird nicht angezeigt, da diese nicht abgefragt wurde. Hier wird jetzt nur eine einzelne Spalte abgefragt: "Select kundennummer From rechnung". Damit erhalten wir alle Kundennummern, die in Rechnungen vorkommen. Jetzt können wir alle Kundennummern sehen, jedoch ohne spezifische Infos wie zum Beispiel den Vor- oder Nachnamen. Damit kann man zum Beispiel auswerten, welche Kunden Rechnungen erhalten haben. Jetzt kommt "Select Distinct kundennummer As N-R From rechnung". Das bedeutet: Wir holen alle unterschiedlichen Kundennummern und benennen sie als N-R. Mit Distinct vermeidet man doppelte Einträge. Wir können dabei auch direkt Bedingungen einbauen. So filtern wir einen bestimmten Bereich an Kundennummern. In diesem Fall alles größer gleich vierundzwanzig und kleiner gleich achtundzwanzig. Kommen wir jetzt zu einer weiteren Spezifizierung. Mit "Select vorname, nachname From privatkunde Where nachname Like S-Prozent" holen wir alle Kunden, deren Nachname mit dem Buchstaben S beginnt. Das Prozentzeichen steht dabei für beliebige weitere Zeichen. Also jeder Nachname, der mit dem Buchstaben S beginnt, wird somit angezeigt. Diese Art der Filterung wird oft verwendet, um nach bestimmten Anfangsbuchstaben zu suchen. Hier können wir es perfekt sehen. Jede Person, die einen Nachnamen mit S hat, wird uns angezeigt. Es besteht auch die Möglichkeit, die Ausgabe zu sortieren. Dazu nutzen wir "Order-By". Das sortiert die Namen alphabetisch nach dem Vornamen. Jetzt gehen wir einen Schritt weiter und greifen auf zwei Tabellen gleichzeitig zu. In unserem Beispiel geht es um die Tabellen rechnung und rechnungsposition. Damit wir die Daten aus beiden Tabellen sinnvoll zusammenführen können, brauchen wir eine Verbindung, und das machen wir mit einer Join-Bedingung. Die Verbindung erfolgt über die Spalte rechnungsnummer. Dadurch bekommen wir zu jeder Rechnung die passenden Positionen angezeigt. Mit Order By rechnungsnummer sortieren wir die Ergebnisse nach Rechnungsnummer, sodass alles übersichtlich bleibt. Hier sehen wir jetzt die passende Ausgabe dazu. Die Verbindung funktioniert also über die Rechnungsnummer und zeigt detaillierte Infos zur jeweiligen Rechnung. Jetzt verschachteln wir eine Select-Anweisung. Wir fragen die Nachnamen von Kunden ab, deren Kundennummer in einer zweiten Abfrage vorkommt. Dort wird überprüft, ob Kreditkarteninformationen vorhanden sind. Falls welche vorhanden sind, dann werden diese angezeigt. Das Prinzip lautet: Die äußere Abfrage nutzt das Ergebnis der inneren, um gezielt zu filtern. Hier sehen wir jetzt alle Nachnamen, wo Kreditkarteninformationen vorhanden sind. Genau das, was wir mit der Abfrage erreichen wollten. Diese Abfrage zeigt jetzt alle Produkte, für die es keinen Rabatt gibt. Mit "Not-Exists" wird überprüft, ob es keinen passenden Eintrag in der rabatt-Tabelle gibt. Diese SQL-Anweisung gibt alle Datensätze aus der Tabelle produkt zurück, für die kein zugehöriger Eintrag in der Tabelle "produkt-rabatt" existiert. Im Detail bedeutet das: Die äußere SELECT-Anfrage bezieht sich auf die Tabelle produkt und fordert mit SELECT \* alle Spalten dieser Tabelle an. Die WHERE NOT EXISTS-Klausel filtert diese Ergebnisse so, dass nur diejenigen Produkte angezeigt werden, für die keine Zeile in der Tabelle "produkt-rabatt" existiert, bei der die produktnummer des Produkts mit der produktnummer in "produkt-rabatt" übereinstimmt. Mit anderen Worten: Es werden alle Produkte ermittelt, für die kein Rabatt hinterlegt ist. Technisch prüft die Unterabfrage für jedes Produkt aus der äußeren Abfrage, ob ein entsprechender Rabattdatensatz existiert. Falls nicht, wird das Produkt in das Endergebnis aufgenommen. Diese SQL-Abfrage ermittelt den höchsten Wert in der Spalte standardpreis der Tabelle produkt. Dabei wird die Aggregatfunktion "Max" verwendet, um den maximalen Standardpreis zu bestimmen. Das Ergebnis wird in der Ausgabespalte mit dem Aliasnamen teuerstes bezeichnet. Die Abfrage liefert somit genau einen Zahlenwert zurück: den höchsten Standardpreis aller in der Tabelle enthaltenen Produkte. Man kann "Max" in vielen Zusammenhängen einsetzen, und das Ergebnis ist immer ein einzelner Wert, also genau ein Datensatz. Wichtig ist: Es wird nicht angezeigt, zu welchem Produkt dieser Preis gehört, sondern nur der Zahlenwert. Wenn man auch das Produkt sehen will, benötigt man eine weitere Abfrage oder eine Kombination mit anderen Befehlen. Diese SQL-Abfrage zählt, wie oft jede einzelne Produktnummer in der Tabelle rechnungsposition vorkommt. Dazu wird die Funktion "Count" verwendet, die die Anzahl der Zeilen pro Produktnummer ermittelt. Mit "GROUP-BY produktnummer" wird festgelegt, dass die Zählung getrennt für jede Produktnummer erfolgen soll. Das Ergebnis ist eine Liste aller Produktnummern zusammen mit der Anzahl der jeweiligen Vorkommen in der Tabelle – also wie häufig jedes Produkt in Rechnungspositionen verwendet wurde. Die Ausgabe zeigt also zu jeder Produktnummer die Anzahl der Vorkommen. So kann man Daten gruppieren und analysieren und hilfreiche Schlüsse daraus ziehen.